24
תגובות
איך אני יכול ליצור פונקציה שתיקח אובייקט בתור פרמטר (stdClass), ותבדוק אם אין בו ערכים חוץ מ-false, ונוסף על כך, שלא תחזיר שגיאה אם ה-stdClass לא קיים?

24 תשובות

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

כתבתי את זה, אבל יש בזה שתי בעיות (1 - תהיה שגיאה אם המשתנה בפרמטר לא מוגדר. 2 - משום מה זה לא עובד לי. לא מצאתי את הבעיה.):

function e($a) {
    if (is_object($a))
        $a = get_object_vars($a);
    if (!(sizeof($a) == 0)) {
        foreach ($a as $value) {
            if (is_object($value) || is_array($value))
                e($value);
            else {
                if (!empty($value))
                    return false;
            }
        }
    }
    else {
    return true;
    }
}

$bla = array();
$bla[0] = array();
$bla[0][0] = array();

if (e($bla))
    echo "bla";

avatar ענה intval ב 15 לאוגוסט 2012 #

א. לא הבנתי מה זאת אומרת לבדוק שאין כל הערכים ב stdClass הם false.
אולי הכוונה למאפיינים? אם כן, התשובה לשאלה שלך תהיה:

ב. אתה כנראה עושה משהו לא נכון.
יש לך בעיה, המצאת לה איזה פתרון מוזר ועכשיו אתה שואל איך לממש אותו.
אין באמת אף סיבה לעבור כל המאפיינים של stdClass. אם אתה מאוד רוצה, צור מחלקה מסוג מסוים כלשהו שתהיה לה רשימת מאפיינים שהיא בעצמה תבדוק. אבל שוב פעם, לי, כרגע, זה נשמע כמו נסיון לממש פתרון לא נכון לבעיה כלשהי.

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

כן, התכוונתי למאפיינים כנראה.
מה שרציתי לעשות זה לכתוב פונקציה שלוקחת אובייקט/מערך בתור פרמטר, ומחזירה:
true - אם באובייקט/מערך אין אובייקטים/מערכים/מאפיינים/ערכים בכלל, או שיש, אבל יש בהם false וכדו' (כמו ()empty על כל מאפיין/ערך).
false - להפך.

avatar ענה intval ב 15 לאוגוסט 2012 #

בשביל מה אתה צריך פונקציה כזו?
סתם בשביל התרגול? תתרגל. תנסה עוד פעם. אתה בכיוון. אם נכתוב לך את התשובה זה יאבד את הפואנטה

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

כי יש לי מערך רב ממדי בשם $errors, שאני מכניס אליו כל מיני שגיאות, כמו שגיאות בטפסים.
במקום שזה יהיה מערכים, רציתי לעשות את זה אובייקטים... ואני צריך מדי פעם לבדוק אם אובייקט/מאפיין מוגדר והוא לא מכיל false או מאפיין שמכיל false וכדו', אז חשבתי לכתוב פונקציה שתעשה לי את זה. ואם כבר אני כותב את זה, למה שהפונקציה הזאת לא תעשה את זה גם למערכים? (כי גם ככה זה ממיר את האובייקט למערך...)
בהחלט. אני אנסה שוב. :)

avatar ענה intval ב 15 לאוגוסט 2012 #

למה אתה רוצה להחליף את המערך באובייקט?
אתה מבין את ההבדל ביניהם ולמה כל אחד מהם מיועד?

avatar ענה intval ב 15 לאוגוסט 2012 #

הקישור הזה לא עונה על השאלה למה להחליף מערך של מחרוזות באובייקט עם מספר לא ברור של מאפיינים שיכולים להיות ויכולים לא להיות.
json_encode עובד יופי גם על מערכים.

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

אבל אני רוצה להמשיך להרחיב את ה-JSON אחרי שאני יוצר אותו, ולא ליצור בהתחלה סט מערכים ולהמיר אותם ל-JSON.

avatar ענה intval ב 15 לאוגוסט 2012 #

o.O
תרחיב את המערך כמה שאתה רוצה ובסוף תפעיל עליו json_encode
אני לא מבין את הבעיה (הפסיכולוגית?) של זה.

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

אני משנה אותו לכל אורך הסקריפט... אני לא יכול כל שנייה לשנות אותו ל-JSON, ואז למערך ואז שוב ל-JSON.
אם כי כשחושבים על זה, אני מניח שעדיף לי להישאר עם מערכים במקום עם אובייקטים כאן; שיניתי לגמרי את הפונקציה, ואני חושב שאני קרוב לסיום, אבל זה יצא ארוך מכדי לשמש כפונקציה שאשתמש בה לעתים קרובות (זה כולל פונקציית עזר שמצאתי ברשת).

avatar ענה intval ב 15 לאוגוסט 2012 #

עד סוף הסקריפט אתה ממשיך או עם אובייקט או עם מערך.
פעם אחת בסוף הסקריפט אתה מפעיל על זה את json_encode והופך את האובייקט או המערך שלך למחרוזת.
אני לא רואה שום סיבה למה שתעשה את כל הסיפור הזה עם אובייקט ולא עם מערך.

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

ואז אני כבר לא יכול להשתמש בו בצורת אובייקט, כי הסקריפט נגמר. :)
זה לא שאני רוצה לשלוח אותו ב-AJAX או משהו כזה.

avatar ענה intval ב 15 לאוגוסט 2012 #

בסוף הסקריפט - זה בסוף הסקריפט.
אם אתה עדיין רוצה להשתמש בו בתור לא משנה מה, זה עוד לא סוף הסקריפט.

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

נכון, אבל אני רציתי להשתמש בו בתור אובייקט לכל אורך הסקריפט. :)

avatar ענה intval ב 15 לאוגוסט 2012 #

כנראה שאין טעם לשאול מה הקשר של json לכל הסיפור הזה אם אתה לא מתכנן לשלוח את זה לדפדפן. כי גם לך אין באמת מושג. נכון ?

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

לא ידעתי שיש דבר כזה stdClass. :)

avatar ענה JBStyle ב 15 לאוגוסט 2012 #

אתה רוצה לעשות את זה כאובייקט ?
אתה יכול להשתמש בArrayObject ואז פשוט לגשת אל זה כמו סינטקס של אובייקט .

avatar ענה OrelBeY ב 15 לאוגוסט 2012 #

לא ידעתי שזה קיים. :)
תודה. ^^
אבל עדיין יש את הבעיה שמבחינת הפונקציה empty, אובייקט וכל שכן אובייקט שמכיל אובייקט, גם אם הם ריקים או מכילים false וכדו' - הוא יחזיר false אם יש אותם.

avatar ענה intval ב 16 לאוגוסט 2012 #

אין לי תשובה טובה לשאלה "למה אני לא מצליח לחצות את המדבר על אופניים".

avatar ענה OrelBeY ב 16 לאוגוסט 2012 #

אז אולי יש לך תשובה טובה לשאלה "איך לחצות את המדבר". :)

avatar ענה intval ב 16 לאוגוסט 2012 #

לקחת מערך ולאורך כל הדרך להכניס אליו דברים

avatar ענה OrelBeY ב 16 לאוגוסט 2012 #

אוקיי. :)
תודה. ^^

avatar ענה OrelBeY ב 16 לאוגוסט 2012 #

בכל מקרה, אם מישהו רוצה, כתבתי פונקציית empty שמקבלת יותר מפרמטר אחד. אם יש פרמטר שהוא מערך או אובייקט, השיטה אצלו מעט שונה מ-empty רגיל, בכך שגם מערך דו ממדי (כנ"ל לגבי אובייקטים) נחשב empty, ולא רק מערך חד ממדי (ובמקרה הזה גם אובייקט).
הבדל נוסף בין הפונקציה הזו ל-empty: אם חלק מהפרמטרים לא הוגדרו - יש שגיאה... (מה שמבחינתי די הורס את הפונקציה הזו. :-))

function m_empty() {
    $args = func_get_args();
    foreach ($args as $arg) {
        if (is_object($arg) || is_array($arg)) {
            if (is_object($arg))
                $arg = get_object_vars($arg);
            foreach ($arg as $value) {
                if (is_object($value))
                    $value = get_object_vars($value);
                if (!empty($value))
                    return false;
               
            }
        }
        else if (!empty($arg))
            return false;
    }
    return true;
}